/***************************************************************************************************
  Copyright(C)   2011-2013
  All rights reserved.
  File Name: updatefile.h

  Description:usb资源文件更新管理模块

       　开启线程监测usb设备，自动挂载usb设备后开启线程来检查是否有路线资源文件，从中找出最新的资源，进行更新，
        将资源更新到本机中，更新前做备份，如果出错则恢复原来资源文件，更新完成后卸载USB设备，并通知pisplayer显示更新情况


  ***************************************************************************************************/

#ifndef UPDATEFILE_H
#define UPDATEFILE_H

#include <QObject>
#include <QDebug>
#include <QFileInfo>
#include <QFileInfoList>
#include <QTimer>

#include "usb/usbmonitor.h"
#include "usb/usbthread.h"
#include "public/xmlparser.h"
#include "public/configclass.h"
#include "public/environment.h"


extern QString g_installPath;

#define UMOUNTMAXCOUNT 4     //最大的卸载次数,意味着等待时间为3+4*2=11秒
#define RESOURCEPATHBACKUP  g_installPath + "/backup/resource"

class UpdateFile : public QObject
{
    Q_OBJECT
public:
    explicit UpdateFile(QObject *parent = 0);
    ~UpdateFile();

    bool checkfile(const QString& strPath);
    bool start();
    void stop();

    //处理了20％，则返回值为20
    int  percent();


    bool backUpData() const;
    bool getBackUpData();

private:
    UsbMonitor      *usbMonitor;
    XmlParser       *xmlParser;
    Configclass     configClass;
    UsbThread       *usbThread;
    QString         updateXmlPath;              //更新XML路径

    QString         backUpPath;                 //备份路径
    QString         currentVersion;             //当前版本号，即更新时间  格式：20111011
//    QTimer          *parserTimer;             //xml解析时间定时器

    QStringList     m_usbPathList;
    int             m_nCurUsbNum;

    bool            m_isUpdate;
    int             m_umountCount;              //卸载USB次数

    QTimer          *m_usbTimer;


signals:
    void finish();

    //卸载USB情况,0成功,-1失败
    void umountUsbState(const int state);

    //开始更新,可能情况,proCount <= 0开始更新,proCount>0,找到更新文件的数量
    void startToUpdate(const int proCount, const QString& publishTime);

    //err：-1,xml解析出错;-2,当前版本为最新的;-3,拷贝数据库或者pro文件出错；-4,拷贝资源文件出错;-5,挂载U盘失败; -6,更新文件不齐全; -7,更新失败，回复备份失败;
    void updateFinish(const int condition, const ProjectStruct &project);

public slots:
    void findUsbDisk(const int, const QString&);    
    void updateFinish();

    void receXmlParser(int err, const QString& proPath, const QString& publishTime, const QString& dbName, const QString& resourcePath);

    void umountUsb();



};

#endif // UPDATEFILE_H
